package com.example.csmall.product.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class TirmerAspect {

    /*
     * AOP的核心概念
     * 连接点(JoinPoint): 数据处理过程的某个节点，可能是执行某个方法，也可能是抛出某个异常
     * 切入点(PointCut): 连接1个或若干个连接点的表达式
     * */

    @Around("execution(* com.example.csmall.product.service.*.*(..))")
    public Object xxx(ProceedingJoinPoint pjp) throws Throwable {
        //pjp中存放的就是执行此切面方法时，需要本身要调用什么方法时的调用信息

        log.debug("开始执行切面方法xxx:");
        //获得类型名称
        String typeName = pjp.getTarget().getClass().getName();
        //具体执行的方法名称
        String methodName = pjp.getSignature().getName();
        //所执行方法的参数列表
        Object[] args = pjp.getArgs();
        log.debug("类型:{}", typeName);
        log.debug("方法名称:{}", methodName);
        log.debug("参数列表:{}", args);
        long start = System.currentTimeMillis();
        Object proceed = pjp.proceed();
        long end = System.currentTimeMillis();
        log.debug("执行耗时:" + (end - start) + "毫秒");
        return proceed;
    }
}
